<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>2970. 统计移除递增子数组的数目 I</title>
</head>
<body>
  <script>
//     给你一个下标从 0 开始的 正 整数数组 nums 。

// 如果 nums 的一个子数组满足：移除这个子数组后剩余元素 严格递增 ，那么我们称这个子数组为 移除递增 子数组。比方说，[5, 3, 4, 6, 7] 中的 [3, 4] 是一个移除递增子数组，因为移除该子数组后，[5, 3, 4, 6, 7] 变为 [5, 6, 7] ，是严格递增的。

// 请你返回 nums 中 移除递增 子数组的总数目。

// 注意 ，剩余元素为空的数组也视为是递增的。

// 子数组 指的是一个数组中一段连续的元素序列。

 

// 示例 1：

// 输入：nums = [1,2,3,4]
// 输出：10
// 解释：10 个移除递增子数组分别为：[1], [2], [3], [4], [1,2], [2,3], [3,4], [1,2,3], [2,3,4] 和 [1,2,3,4]。移除任意一个子数组后，剩余元素都是递增的。注意，空数组不是移除递增子数组。
// 示例 2：

// 输入：nums = [6,5,7,8]
// 输出：7
// 解释：7 个移除递增子数组分别为：[5], [6], [5,7], [6,5], [5,7,8], [6,5,7] 和 [6,5,7,8] 。
// nums 中只有这 7 个移除递增子数组。
// 示例 3：

// 输入：nums = [8,7,6,6]
// 输出：3
// 解释：3 个移除递增子数组分别为：[8,7,6], [7,6,6] 和 [8,7,6,6] 。注意 [8,7] 不是移除递增子数组因为移除 [8,7] 后 nums 变为 [6,6] ，它不是严格递增的。
 

// 提示：

// 1 <= nums.length <= 50
// 1 <= nums[i] <= 50

/**
 * @param {number[]} nums
 * @return {number}
 */
 var incremovableSubarrayCount = function(nums) { // 定义一个函数incremovableSubarrayCount，接受一个数组nums作为参数
  const n = nums.length; // 声明常量n，并将其设置为传入数组nums的长度
  let res = 0; // 初始化变量res为0，该变量用于存储最终的计算结果
  let l = 1; // 初始化变量l为1，l代表当前考察的子数组的左边界索引
  while (l < n && nums[l - 1] < nums[l]) { // 当l小于n且当前元素小于下一个元素时，执行循环
      l++; // 增加l的值，向右移动子数组的左边界
  }
  res += l + (l < n ? 1 : 0); // 累加结果，l表示从第一个元素开始的递增子数组个数，如果l小于n，则再加上1
  for (let r = n - 2; r >= 0; r--) { // 从倒数第二个元素开始向前遍历，r代表当前考察的子数组的右边界索引
      while (l > 0 && nums[l - 1] >= nums[r + 1]) { // 当l大于0且当前左边界元素大于等于右边界下一个元素时，执行循环
          l--; // 减少l的值，向左移动子数组的左边界
      }
      res += l + (l <= r ? 1 : 0); // 累加结果，l表示从当前r开始的递增子数组个数，如果l小于等于r，则再加上1
      if (nums[r] >= nums[r + 1]) { // 如果当前元素大于等于下一个元素，则终止循环
          break; // 退出for循环
      }
  }
  return res; // 返回计算结果res
};
  </script>
</body>
</html>